package com.jiang.operator;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 一些操作放在这个类中
 */
public class CommonUtils {
    public static String INTRANET_IP;


    public static boolean isLocal(String host){
        try {
            //Enumeration接口中定义了一些方法，通过这些方法可以枚举（一次获得一个）对象集合中的元素。
            //static Enumeration getNetworkInterfaces()返回此计算机上的所有接口。
            //NetworkInterface此类表示由名称和分配给此接口的IP地址列表组成的网络接口。
            // 它用于标识多播组加入的本地接口。接口通常以诸如“le0”之类的名称而为人所知。
            Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            while (allNetInterfaces.hasMoreElements()){
                //该枚举是否还有元素，显然就有类似指针地东西
                NetworkInterface networkInterface = allNetInterfaces.nextElement();//找下一个
                //isvirtual 返回此接口是否为虚拟接口（也称为子接口）。
                //在某些系统上，虚拟接口是作为物理接口的子级创建的接口，
                // 并具有不同的设置（例如地址或MTU）。 通常，接口的名称将是父级的名称，
                // 后跟冒号（:)和标识子级的数字，因为单个物理接口上可以连接多个虚拟接口。
                //如果该地址是本地回环地址，或者是虚拟地址，或者是未被占用地址，则跳过本次循环，下一个
                if(networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()){
                    continue;//跳过本次循环
                }
                Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();//获得该网口的绑定的IP
                while(addresses.hasMoreElements()){
                    InetAddress ip = addresses.nextElement();
                    if(ip != null){
                        if(ip.getHostAddress().equals(host)){
                            return true; //如果比较之后，发现与本机的ip相同，返回真
                        }
                    }

                }

            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获得外网IP
     * @return
     */
    private static String getInternetIp(){
        try{
            Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();
            InetAddress ip = null;
            Enumeration<InetAddress> addresses;
            while(networks.hasMoreElements()){
                addresses = networks.nextElement().getInetAddresses();
                while (addresses.hasMoreElements()){
                    ip = addresses.nextElement();
                    if(ip != null && ip instanceof InetAddress && ip.isSiteLocalAddress() &&
                            !ip.getHostAddress().equals(INTRANET_IP)){
                        return ip.getHostAddress();

                    }
                }
            }
            //如果没有外网IP，就返回内网IP
            return INTRANET_IP;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获得内网IP
     * @return
     */
    private static String getIntranetIp(){
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static String getV4IP(){
        String ip = "";
        String chinaz = "http://2020.ip138.com/";

        String inputLine = "";
        String read = "";
        try{
            URL url = new URL(chinaz);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            while ((read = in.readLine()) != null){
                inputLine += read;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        Pattern p = Pattern.compile("\\[(.*?)\\]");
        Matcher m = p.matcher(inputLine);
        if(m.find()){
            String ipstr = m.group(1);
            ip = ipstr;
        }
        return ip;
    }

}
